package com.sky.chapter1.waitAndnotify;

import java.util.LinkedList;
import java.util.Queue;

/**
 * @author : 陈庆彪
 * create : 2020-06-26 11:12
 * description: 测试共享变量的锁获取变化
 **/
public class synchronizedTest {


    public static void main(String[] args) {
        Queue queue = new LinkedList();
        //生产线程
        synchronized (queue) {
            //消费队列满，则等待队列空闲
            while (queue.size() == 8) {
                try {
                    //挂起当前线程，并释放通过同步块获取的queue上的锁，让消费线程可以获取该锁，然后获取队列里的元素。
                    queue.wait();
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
            //空闲则生成元素，并通知消费者线程
            System.out.println("队列生产中.............");
            queue.add("sss");
            queue.notifyAll();
        }
        //消费线程
        synchronized (queue) {
            //消费队列为空
            while (queue.size() == 0) {
                try {
                    //挂起当前线程，并释放通过同步块获取的queue上的锁，让生产者线程可以获取该锁，将生产元素放入队列。
                    queue.wait();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            //消费元素，并通知唤醒生产线程。
            System.out.println("队列消费中...........");
            queue.remove();
            queue.notifyAll();
        }
        System.out.println("线程执行次数" + queue);
    }
}
